package com.dz51.core.proxy;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate3.HibernateTemplate;

public interface TemplateContainer {
	/**
	 * 得到数据源类型 salve 或 master
	 * 
	 * @return
	 */
	DataSourceType getDataSourceType();

	/**
	 * 根据传入模板类型获取数据源
	 * 
	 * @param templateType
	 *            模板类型
	 * @return
	 * @throws Exception
	 */
	<T> T getTemplate(TemplateType templateType) throws Exception;

	/**
	 * 
	 * @param templateType
	 * @return
	 */
	int hash(TemplateType templateType);

	/**
	 * 检测数据源状态
	 */
	void check();

	/**
	 * 切换数据源
	 * 
	 * @param jdao
	 * @param add
	 *            是否是添加
	 */
	void changDataSource(JdbcTemplate jdao, boolean add);

	/**
	 * 切换数据源
	 * 
	 * @param hdao
	 * @param add
	 *            是否是添加
	 */
	void changDataSource(HibernateTemplate hdao, boolean add);

	HibernateTemplate getHibernateTemplate();

	JdbcTemplate getJdbcTemplate();

	enum DataSourceType {
		MASTER, SLAVE
	}

	enum TemplateType {
		HibernageTemplate(HibernateTemplate.class), JdbcTemplate(JdbcTemplate.class);
		private Class<?> clazz;

		private TemplateType(Class<?> clazz) {
			this.clazz = clazz;
		}

		public Class<?> getClazz() {
			return clazz;
		}
	}
}
